package karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import karaoke.excepcion.DAOExcepcion;
import karaoke.modelo.Cliente;
import karaoke.modelo.Evento;
import karaoke.modelo.Local;
import karaoke.util.ConexionBD;

public class EventoDAO {

        
        //BUSCAR
                public List<Evento> buscarPorNombre(String nombre)
                                throws DAOExcepcion {
                        String query = "select idevento, nombre, fecha, capacidad, descripcion,local_idlocal,estado, cliente_idcliente from evento where nombre like ?";
                        List<Evento> lista = new ArrayList<Evento>();
                        Connection con = null;
                        PreparedStatement stmt = null;
                        ResultSet rs = null;
                        try {
                                con = ConexionBD.obtenerConexion();
                                stmt = con.prepareStatement(query);
                                stmt.setString(1, "%" + nombre + "%");
                                rs = stmt.executeQuery();
                                while (rs.next()) {
                                        Evento vo = new Evento();
                                        vo.setIdevento(rs.getInt("idevento"));
                                        vo.setNombre(rs.getString("nombre"));
                                        vo.setFecha(rs.getString("fecha"));
                                        vo.setCapacidad(rs.getInt("capacidad"));
                                        vo.setDescripcion(rs.getString("descripcion"));
                                        vo.setEstado(rs.getString("estado"));
                                        Local local= new Local();
                                        local.setIdLocal(rs.getInt("local_idlocal"));
                                        vo.setLocal(local);
                                         
                                        Cliente cliente= new Cliente();
                                        cliente.setIdCliente(rs.getInt("cliente_idcliente"));
                                        vo.setCliente(cliente);
                                        lista.add(vo);
                                }
                        } catch (SQLException e) {
                                System.err.println(e.getMessage());
                                throw new DAOExcepcion(e.getMessage());
                        } finally {
                                this.cerrarResultSet(rs);
                                this.cerrarStatement(stmt);
                                this.cerrarConexion(con);
                        }
                        System.out.println(lista.size());
                        return lista;
                }
                
                
                
                private void cerrarConexion(Connection con) {
                        // TODO Auto-generated method stub
                        
                }



                private void cerrarStatement(PreparedStatement stmt) {
                        // TODO Auto-generated method stub
                        
                }



                private void cerrarResultSet(ResultSet rs) {
                        // TODO Auto-generated method stub
                        
                }



                //INSERTAR
                public Evento insertar(Evento vo) throws DAOExcepcion {
                        String query = "insert into Evento(nombre, fecha, capacidad, descripcion, estado,local_idlocal, cliente_idcliente) values (?,?,?,?,?,?,?)";
                        Connection con = null;
                        PreparedStatement stmt = null;
                        ResultSet rs = null;
                        try {
                                con = ConexionBD.obtenerConexion();
                                stmt = con.prepareStatement(query);
                                stmt.setString(1, vo.getNombre());
                                stmt.setString(2, vo.getFecha());
                                stmt.setInt(3, vo.getCapacidad());
                                stmt.setString(4, vo.getDescripcion());
                                stmt.setString(5, vo.getEstado());
                                
                    stmt.setInt(6, (vo.getLocal()).getIdLocal());
                    stmt.setInt(7, (vo.getCliente()).getIdCliente());
                                
                                int i = stmt.executeUpdate();
                                if (i != 1) {
                                        throw new SQLException("No se pudo insertar");
                                }
                                // Obtener el ultimo id
                                int id = 0;
                                query = "select last_insert_id()";
                                stmt = con.prepareStatement(query);
                                rs = stmt.executeQuery();
                                if (rs.next()) {
                                        id = rs.getInt(1);
                                }
                                vo.setIdevento(id);

                        } catch (SQLException e) {
                                System.err.println(e.getMessage());
                                throw new DAOExcepcion(e.getMessage());
                        } finally {
                                this.cerrarResultSet(rs);
                                this.cerrarStatement(stmt);
                                this.cerrarConexion(con);
                        }
                        return vo;
                }
                
                
                //OBTENER
                public Evento obtener(int idevento) throws DAOExcepcion {
                        Evento vo = new Evento();
                        Connection con = null;
                        PreparedStatement stmt = null;
                        ResultSet rs = null;
                        try {
                                String query = "select idevento, nombre, fecha, capacidad, descripcion from evento where idevento=?";
                                con = ConexionBD.obtenerConexion();
                                stmt = con.prepareStatement(query);
                                stmt.setInt(1, idevento);
                                rs = stmt.executeQuery();
                                if (rs.next()) {
                                        vo.setIdevento(rs.getInt(1));
                                        vo.setNombre(rs.getString(2));
                                        vo.setFecha(rs.getString(3));
                                        vo.setCapacidad(rs.getInt(4));
                                        vo.setDescripcion(rs.getString(4));
                                }
                        } catch (SQLException e) {
                                System.err.println(e.getMessage());
                                throw new DAOExcepcion(e.getMessage());
                        } finally {
                                this.cerrarResultSet(rs);
                                this.cerrarStatement(stmt);
                                this.cerrarConexion(con);
                        }
                        return vo;
                }

                
                //ELIMINAR
                public void eliminar(int idevento) throws DAOExcepcion {
                        String query = "delete from evento WHERE idevento=?";
                        Connection con = null;
                        PreparedStatement stmt = null;
                        try {
                                con = ConexionBD.obtenerConexion();
                                stmt = con.prepareStatement(query);
                                stmt.setInt(1, idevento);
                                int i = stmt.executeUpdate();
                                if (i != 1) {
                                        throw new SQLException("No se pudo eliminar");
                                }
                        } catch (SQLException e) {
                                System.err.println(e.getMessage());
                                throw new DAOExcepcion(e.getMessage());
                        } finally {
                                this.cerrarStatement(stmt);
                                this.cerrarConexion(con);
                        }
                }

                
                //ACTUALIZAR
                public Evento actualizar(Evento vo) throws DAOExcepcion {
                        String query = "update evento set nombre=?,fecha=?,capacidad=?,descripcion=?,local_idlocal=?, cliente_idcliente=? where idevento=?";
                        Connection con = null;
                        PreparedStatement stmt = null;
                        
                        try {
                                con = ConexionBD.obtenerConexion();
                                stmt = con.prepareStatement(query);
                                stmt.setString(1, vo.getNombre());
                                stmt.setString(2, vo.getFecha());
                                stmt.setInt(3, vo.getCapacidad());
                                stmt.setString(4, vo.getDescripcion());
                                stmt.setInt(5, (vo.getLocal()).getIdLocal());
                                stmt.setInt(6, (vo.getCliente()).getIdCliente());
                                stmt.setInt(7, vo.getIdevento());
                                
                                int i = stmt.executeUpdate();
                                if (i != 1) {
                                        throw new SQLException("No se pudo actualizar");
                                }       
                        } catch (SQLException e) {
                                System.err.println(e.getMessage());
                                throw new DAOExcepcion(e.getMessage());
                        } finally {
                                this.cerrarStatement(stmt);
                                this.cerrarConexion(con);
                        }
                        return vo;
                }

                
                //LISTAR
                public List<Evento> listar() throws DAOExcepcion {
                	    List<Evento> c = new ArrayList<Evento>();
                        Connection con = null;
                        PreparedStatement stmt = null;
                        ResultSet rs = null;
                        try {
                                con = ConexionBD.obtenerConexion();
                                String query = "select idevento,nombre,fecha,capacidad,descripcion from evento order by nombre";
                                stmt = con.prepareStatement(query);
                                rs = stmt.executeQuery();
                                while (rs.next()) {
                                        Evento vo = new Evento();
                                        vo.setIdevento(rs.getInt("idevento"));
                                        vo.setNombre(rs.getString("nombre"));
                                        vo.setFecha(rs.getString("fecha"));
                                        vo.setCapacidad(rs.getInt("capacidad"));
                                        vo.setDescripcion(rs.getString("descripcion"));
                                        c.add(vo);
                                }

                        } catch (SQLException e) {
                                System.err.println(e.getMessage());
                                throw new DAOExcepcion(e.getMessage());
                        } finally {
                                this.cerrarResultSet(rs);
                                this.cerrarStatement(stmt);
                                this.cerrarConexion(con);
                        }
                        return c;
                }
                
                
}
